#ifndef SYS_MANAGER_H
#define SYS_MANAGER_H

#include <stdint.h>
#include <stdbool.h>

// 系统状态错误位定义（每一位代表一个模块的错误）
#define SYS_ERROR_POWER   (1U << 0)  // 电源模块错误（bit 0）
#define SYS_ERROR_USB     (1U << 1)  // USB 模块错误（bit 1）
#define SYS_ERROR_ADC     (1U << 2)  // ADC 模块错误（bit 2）
#define SYS_ERROR_UART    (1U << 3)  // 串口模块错误（bit 3）
#define SYS_ERROR_USER    (1U << 4)  // 用户模块错误（bit 4）
#define SYS_ERROR_RESERVED (1U << 5) // 保留位（bit 5）

typedef enum
{
    T_SYS_STA_OK        = 0x00U,  // 操作成功
    T_SYS_STA_ERROR     = 0x01U,  // 一般错误
    T_SYS_STA_BUSY      = 0x02U,  // 资源忙
    T_SYS_STA_TIMEOUT   = 0x03U   // 操作超时
} T_SYS_STA;

// 电源模块状态
typedef struct 
{
    uint8_t power_sta   : 1; // 电源开关状态（0：关，1：开）
    uint8_t fault       : 1; // 故障标志（0：正常，1：故障）
    uint8_t low_voltage : 1; //是否低电压
    uint8_t wait_report : 1; // 是否需要上报电源状态
    uint8_t pending_switch  : 1; // 新增：电源切换待处理标志（中断安全）
    uint8_t resv        :3;
} T_POWER_STATUS;


// 串口模块状态
typedef struct
{
	uint16_t uart1_dma_tx_busy : 1;
	uint16_t uart2_dma_tx_busy : 1;
	uint16_t uart3_dma_tx_busy : 1;
	uint16_t uart1_error       : 2;  // USART1 错误标志
	uint16_t uart2_error       : 2;  // USART2 错误标志
	uint16_t uart3_error       : 2;  // USART3 错误标志
	uint16_t reserved          : 7; // 保留位  

    uint32_t uart1_error_code;
    uint32_t uart2_error_code;
    uint32_t uart3_error_code;

    uint16_t uart1_dma_tx_count;  // USART1 DMA 发送繁忙计数
    uint16_t uart2_dma_tx_count;  // USART2 DMA 发送繁忙计数
    uint16_t uart3_dma_tx_count;  // USART3 DMA 发送繁忙计数
    
    // 新增：递进式限流控制字段
    uint8_t uart1_error_count;              // UART1 总错误计数
    uint8_t uart1_consecutive_send_failures; // UART1 连续发送失败次数
    uint8_t uart1_send_delay_counter;       // UART1 发送限流计数器
    
    uint8_t uart2_error_count;              // UART2 总错误计数  
    uint8_t uart2_consecutive_send_failures; // UART2 连续发送失败次数
    uint8_t uart2_send_delay_counter;       // UART2 发送限流计数器
    
    uint8_t uart3_error_count;              // UART3 总错误计数
    uint8_t uart3_consecutive_send_failures; // UART3 连续发送失败次数  
    uint8_t uart3_send_delay_counter;       // UART3 发送限流计数器
    
} T_UART_STATUS;

// USB 模块状态
typedef struct 
{
    uint8_t connected : 1; // USB 连接状态
    uint8_t active    : 1; // USB 活动状态
    uint8_t error     : 1; // 错误标志
    uint8_t reserved  : 1; // 保留位
} T_USB_STATUS;

// ADC 模块状态
typedef struct 
{
    uint8_t ready     : 1; // ADC 准备就绪状态
    uint8_t sampling  : 1; // 正在采样标志
    uint8_t error     : 1; // 错误标志
    uint8_t reserved  : 1; // 保留位
} T_ADC_STATUS;

// 用户模块状态
typedef struct 
{
    uint8_t  buzzer_state;   // 蜂鸣器的当前状态，0：关闭，1：开启
    uint16_t buzzer_timer;   // 蜂鸣器的计时器，控制开启时长
} T_USER_STATUS;

// 系统状态主结构体
typedef struct 
{
    T_POWER_STATUS power;  // 电源模块状态
    T_USB_STATUS usb;      // USB 模块状态
    T_ADC_STATUS adc;      // ADC 模块状态
    T_UART_STATUS uart;  // 串口模块状态
    T_USER_STATUS user;    // 用户模块状态
    uint8_t error;
    uint8_t wait_error_recover : 1;
    uint8_t is_communicating   : 1;
    uint8_t rscv               : 6;
    uint8_t dbg_flag;
    uint16_t midi_comm_timer;  // 新增：MIDI通信计时器
} T_SYS_STATUS;


extern T_SYS_STATUS system_status;

T_SYS_STA sys_status_check(void); 

#endif // SYS_MANAGER_H
